{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.0.57\n"
     ]
    }
   ],
   "source": [
    "from fastai import *\n",
    "from fastai.text import *\n",
    "import fastai\n",
    "print(fastai.__version__)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pathlib import Path\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def load_text_as_df(file_path):\n",
    "    with open(str(file_path), 'r', encoding='UTF-8') as f:\n",
    "        str_list = f.readlines()\n",
    "    return pd.DataFrame(str_list, columns=['text'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "data_bunch_arithmetics_25perc  extrapolate.csv\tmodels\r\n",
      "data_bunch_arithmetics_50perc  interpolate.csv\ttrain.csv\r\n"
     ]
    }
   ],
   "source": [
    "fastai_data_path = Path('/storage/git/deep-math/data/interim/fastai/concat')\n",
    "!ls {fastai_data_path}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_path = fastai_data_path/'train.csv'\n",
    "inter_path = fastai_data_path/'interpolate.csv'\n",
    "extra_path = fastai_data_path/'extrapolate.csv'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train = load_text_as_df(train_path)\n",
    "df_inter = load_text_as_df(inter_path)\n",
    "df_extra = load_text_as_df(extra_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>text</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>What is 1 + -9 - -5 - -1?                -2\\n</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-2 + 0 + (3 - 1)                0\\n</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Calculate 8 - (0 + 7 + -4).                5\\n</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>What is the value of (-19 - -12) + (-6 - -5) -...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Evaluate (2 + -8 - -2) + -120 + 129.          ...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                text\n",
       "0      What is 1 + -9 - -5 - -1?                -2\\n\n",
       "1                -2 + 0 + (3 - 1)                0\\n\n",
       "2     Calculate 8 - (0 + 7 + -4).                5\\n\n",
       "3  What is the value of (-19 - -12) + (-6 - -5) -...\n",
       "4  Evaluate (2 + -8 - -2) + -120 + 129.          ..."
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "class CharTokenizer(BaseTokenizer):\n",
    "    def tokenizer(self, t):\n",
    "        return ['xxbos'] + list(t.replace('xxbos', '').replace(' ', '_'))\n",
    "tok = Tokenizer(tok_func=CharTokenizer, pre_rules=[], post_rules=[], special_cases=[])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = TextLMDataBunch.from_df(fastai_data_path, df_train.sample(frac=0.25) ,df_inter, df_extra,\n",
    "                               tokenizer=tok, text_cols=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>idx</th>\n",
       "      <th>text</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>( - 1 _ - _ 7 ) * ( - 3 _ - _ 4 9 / ( - 1 4 ) ) . _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - 4 \\n xxbos _ W h a t _ i s _ 0 . 4 _ - _ 7 8 2 9 ? _ _ _ _ _</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>S i m p l i f y _ ( - 2 * 2 * s q r t ( 2 4 3 ) _ - _ ( s q r t ( 2 4 3 ) _ + _ 5 * 2 * s q r t ( 2 4 3 ) _ + _ s q r t ( 2 4 3 ) ) ) / ( (</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>a n d _ - 1 . _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 3 5 . 3 2 \\n xxbos _ 3 _ * _ 8 . 9 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 2 6 . 7 \\n xxbos _ I n _ b a s e _ 1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>9 0 4 2 2 _ p l u s _ - 0 . 3 ? _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - 1 1 3 2 0 2 6 9 0 4 2 2 . 3 \\n xxbos _ W h a t _ i s _ - 1 * ( - 4 ) / 4 * 2 /</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>4 ) * - 4 * 5 * ( - 1 0 ) / ( - 1 2 5 ) ? _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - 8 \\n xxbos _ D i v i d e _ - 1 6 3 5 0 _ b y _ 3 2 7 . _ _ _ _ _ _ _</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "data.show_batch()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "data.save('data_bunch_arithmetics_25perc')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn = language_model_learner(data, AWD_LSTM, drop_mult=0.5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\n",
      "Min numerical gradient: 8.32E-02\n",
      "Min loss divided by 10: 1.32E-01\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.lr_find()\n",
    "learn.recorder.plot(skip_start=10, skip_end=10, suggestion=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: left;\">\n",
       "      <th>epoch</th>\n",
       "      <th>train_loss</th>\n",
       "      <th>valid_loss</th>\n",
       "      <th>accuracy</th>\n",
       "      <th>time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>0.931580</td>\n",
       "      <td>0.892724</td>\n",
       "      <td>0.708046</td>\n",
       "      <td>1:06:41</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>0.926415</td>\n",
       "      <td>0.890065</td>\n",
       "      <td>0.708769</td>\n",
       "      <td>1:06:45</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>0.919130</td>\n",
       "      <td>0.899690</td>\n",
       "      <td>0.710071</td>\n",
       "      <td>1:06:45</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>0.931552</td>\n",
       "      <td>0.897678</td>\n",
       "      <td>0.707299</td>\n",
       "      <td>1:06:46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>0.913342</td>\n",
       "      <td>0.892686</td>\n",
       "      <td>0.708070</td>\n",
       "      <td>1:06:46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>5</td>\n",
       "      <td>0.924522</td>\n",
       "      <td>0.889046</td>\n",
       "      <td>0.710032</td>\n",
       "      <td>1:06:48</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>6</td>\n",
       "      <td>0.917520</td>\n",
       "      <td>0.885040</td>\n",
       "      <td>0.710360</td>\n",
       "      <td>1:06:46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>7</td>\n",
       "      <td>0.905601</td>\n",
       "      <td>0.881047</td>\n",
       "      <td>0.710526</td>\n",
       "      <td>1:06:46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>8</td>\n",
       "      <td>0.903584</td>\n",
       "      <td>0.878826</td>\n",
       "      <td>0.710804</td>\n",
       "      <td>1:06:47</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>9</td>\n",
       "      <td>0.896460</td>\n",
       "      <td>0.878453</td>\n",
       "      <td>0.711151</td>\n",
       "      <td>1:06:47</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.fit_one_cycle(10, 0.02)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEKCAYAAAD9xUlFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xl4VOX1wPHvyZ6QECCAICBhq4jIEqMCKoI72LrSAtXWtVS0ta3VFrVWccWfStHautQC2gWs4AICIiKKKLIKYZctQAiQhCWB7Mv7++Pe3EySmcyQZJgZ53yeZ565+z0ThnvmXe57xRiDUkopBRAR6ACUUkoFD00KSimlHJoUlFJKOTQpKKWUcmhSUEop5dCkoJRSyqFJQSmllEOTglJKKYcmBaWUUo6oQAdwstq2bWtSU1MDHYZSSoWUNWvW5Blj2nnbLuSSQmpqKqtXrw50GEopFVJEZI8v22n1kVJKKYcmBaWUUg5NCkoppRx+a1MQkanAD4EcY0xfN+uvA54EqoAK4LfGmGX+ikcpFXzKy8vJysqipKQk0KF8b8TFxdG5c2eio6Mbtb8/G5qnA68Ab3tYvxiYY4wxItIP+B/Q24/xKKWCTFZWFklJSaSmpiIigQ4n5BljOHz4MFlZWXTr1q1Rx/Bb9ZExZilwpIH1J0zNE35aAPq0H6XCTElJCSkpKZoQmomIkJKS0qSSV0DbFETkBhHZCswD7mhgu3EislpEVufm5p66AJVSfqcJoXk19e8Z0KRgjHnfGNMbuB6rfcHTdm8YY9KNMent2nm998KtbQePM/mTbeSdKG1ktEop9f0XFL2P7KqmHiLS1l/n2J5znJc/28GRwjJ/nUIpFWIOHz7MgAEDGDBgAB06dKBTp07OfFmZb9eK22+/nW3btvk50lMnYHc0i0hPYKfd0JwGxACH/XY+rCKV0ZYLpZQtJSWFdevWAfD444+TmJjIAw88UGsbYwzGGCIi3P+GnjZtmt/jPJX8VlIQkRnAcuBMEckSkTtF5G4Rudve5CZgo4isA/4GjHZpePZDPP46slLq+2bHjh307duXu+++m7S0NA4cOMC4ceNIT0/n7LPP5oknnnC2veiii1i3bh0VFRW0atWKCRMm0L9/fwYPHkxOTk4AP0Xj+K2kYIwZ62X9c8Bz/jq/x/NqJyelgtLEuZvYnF3QrMfsc3pLHvvR2Y3ad/PmzUybNo3XXnsNgEmTJtGmTRsqKioYPnw4o0aNok+fPrX2yc/P55JLLmHSpEncf//9TJ06lQkTJjT5c5xKQdGmcCpUFxS0+kgp5YsePXpw3nnnOfMzZswgLS2NtLQ0tmzZwubNm+vtEx8fz4gRIwA499xzyczMPFXhNpuQGyW1saqrjzQpKBWcGvuL3l9atGjhTG/fvp2XXnqJlStX0qpVK2655Ra39wLExMQ405GRkVRUVJySWJtT2JQUqssKWn2klDpZBQUFJCUl0bJlSw4cOMDChQsDHZLfaElBKaW8SEtLo0+fPvTt25fu3btz4YUXBjokvxE/dvjxi/T0dNOYh+x8sukg4/61ho9+fRF9OyX7ITKl1MnasmULZ511VqDD+N5x93cVkTXGmHRv+4ZN9ZHeSq+UUt6FTVKoFmIFI6WUOqXCJik4XVK1oVkppTwKn6SgDc1KKeVV+CWFwIahlFJBLXySgjMgnqYFpZTyJGySAlpSUErVMWzYsHo3ok2ZMoV77rnH4z6JiYkAZGdnM2rUKI/H9dZ1fsqUKRQVFTnzI0eO5NixY76G7jdhkxS0Q6pSqq6xY8cyc+bMWstmzpzJ2LENjucJwOmnn86sWbMafe66SWH+/Pm0atWq0cdrLmGTFKpp7ZFSqtqoUaP46KOPKC21nsiYmZlJdnY2AwYM4LLLLiMtLY1zzjmHDz/8sN6+mZmZ9O3bF4Di4mLGjBlDv379GD16NMXFxc5248ePd4bcfuyxxwB4+eWXyc7OZvjw4QwfPhyA1NRU8vLyAJg8eTJ9+/alb9++TJkyxTnfWWedxS9+8QvOPvtsrrzyylrnaS5hNMxFTadUpVQQWjABDm5o3mN2OAdGTPK4OiUlhfPPP5+PP/6Y6667jpkzZzJ69Gji4+N5//33admyJXl5eQwaNIhrr73W402wr776KgkJCWRkZJCRkUFaWpqz7umnn6ZNmzZUVlZy2WWXkZGRwX333cfkyZNZsmQJbdvWfuDkmjVrmDZtGitWrMAYwwUXXMAll1xC69at2b59OzNmzOAf//gHP/nJT5g9eza33HJL8/ytbGFTUtChs5VS7rhWIVVXHRljePjhh+nXrx+XX345+/fv59ChQx6PsXTpUufi3K9fP/r16+es+9///kdaWhoDBw5k06ZNbofcdrVs2TJuuOEGWrRoQWJiIjfeeCNffvklAN26dWPAgAGA/4bmDqOSgvWuOUGpINXAL3p/uv7667n//vtZu3YtxcXFpKWlMX36dHJzc1mzZg3R0dGkpqa6HSrblbtSxO7du3nhhRdYtWoVrVu35rbbbvN6nIZ6SMbGxjrTkZGRfqk+CqOSgj6jWSlVX2JiIsOGDeOOO+5wGpjz8/Np37490dHRLFmyhD179jR4jKFDh/Kf//wHgI0bN5KRkQFYQ263aNGC5ORkDh06xIIFC5x9kpKSOH78uNtjffDBBxQVFVFYWMj777/PxRdf3Fwf16uwKykopVRdY8eO5cYbb3SqkW6++WZ+9KMfkZ6ezoABA+jdu3eD+48fP57bb7+dfv36MWDAAM4//3wA+vfvz8CBAzn77LPrDbk9btw4RowYQceOHVmyZImzPC0tjdtuu805xl133cXAgQNP2VPcwmbo7K925HHzmyt4Z9wgLuie4ofIlFInS4fO9g8dOtsH2vdIKaW8C5ukgA6Ip5RSXoVNUhB9RrNSQSnUqrCDXVP/nuGTFLT+SKmgExcXx+HDhzUxNBNjDIcPHyYuLq7Rxwif3kf2u371lAoenTt3Jisri9zc3ECH8r0RFxdH586dG71/+CQF7ZOqVNCJjo6mW7dugQ5DuQib6qNqWkpVSinPwiYp1AxzoVlBKaU8CZ+kYL9rSUEppTwLn6SgA+IppZRXYZMU0Gc0K6WUV2GTFLSkoJRS3oVPUgh0AEopFQLCJik4tKiglFIehU1SqL55TbukKqWUZ+GTFOz3sgpNCkop5UnYJIVVmUcAeOGTbQGORCmlglfYJIWjRWUA7M4rDHAkSikVvPyWFERkqojkiMhGD+tvFpEM+/W1iPT3VywAkXabQmWVVh8ppZQn/iwpTAeubmD9buASY0w/4EngDT/GQmRE2BSKlFKq0fw2dLYxZqmIpDaw/muX2W+Axg8A7oOoSL1TQSmlvAmWn893Agv8eYLICE0KSinlTcAfsiMiw7GSwkUNbDMOGAdwxhlnNOo8UZoUlFLKq4CWFESkH/AmcJ0x5rCn7Ywxbxhj0o0x6e3atWvUubSkoJRS3gUsKYjIGcB7wM+MMd/5+3xRkcFSU6aUUsHLb9VHIjIDGAa0FZEs4DEgGsAY8xrwZyAF+Ls9BEWFMSbdX/Fo9ZFSSnnnz95HY72svwu4y1/nr0urj5RSyruwqVPRkoJSSnkXNklBSwpKKeVd2CSFKL2jWSmlvAqbK6Xe0ayUUt6FT1LQ6iOllPIqbJKCtikopZR3YZMUtE1BKaW8C5srpbYpKKWUd+GTFLT6SCmlvAqbpKBtCkop5V3YJIVoHRBPKaW8CpsrpdFHMyullFdhkxS085FSSnkXNpfKhJiAP2ROKaWCXtgkBe19pJRS3oVNUtDeR0op5Z0mBaWUUo6wSQpxUZGBDkEppYJe2CSF5IRoAG4d3DXAkSilVPAKm6QAVmNzYpz2QlJKKU/CKimIQJXexKaUUh6FV1JA9M5mpZRqQFglBQQMmhWUUsqTsEoKAmhOUEopz8IqKZRWVJF1tDjQYSilVNAKq6QAMG/DgUCHoJRSQSvskoJSSinPNCkopZRyaFJQSinl0KSglFLKoUlBKaWUQ5OCUkophyYFpZRSDk0KSimlHJoUlFJKOTQpKKWUcmhSUEop5dCkoJRSyuG3pCAiU0UkR0Q2eljfW0SWi0ipiDzgrziUUkr5zqekICI9RCTWnh4mIveJSCsvu00Hrm5g/RHgPuAFX2JQSinlf76WFGYDlSLSE/gn0A34b0M7GGOWYl34Pa3PMcasAsp9jEEppZSf+ZoUqowxFcANwBRjzO+Ajv4LSymlVCD4mhTKRWQscCvwkb0s2j8h1Sci40RktYiszs3NPVWnVUqpsONrUrgdGAw8bYzZLSLdgH/7L6zajDFvGGPSjTHp7dq1O1WnVUqpsBPly0bGmM1YjcKISGsgyRgzyZ+BKaWUOvV8Sgoi8jlwrb39OiBXRL4wxtzfwD4zgGFAWxHJAh7DrnIyxrwmIh2A1UBLoEpEfgv0McYUNP7jKKWUagqfkgKQbIwpEJG7gGnGmMdEJKOhHYwxY72sPwh09vH8zaqkvJK46MhAnFoppYKar20KUSLSEfgJNQ3NIUsk0BEopVRw8jUpPAEsBHYaY1aJSHdgu//C8i9jAh2BUkoFJ18bmt8F3nWZ3wXc5K+glFJKBYavw1x0FpH37bGMDonIbBEJSHtAc9CSglJKuedr9dE0YA5wOtAJmGsvC0k5x0sCHYJSSgUlX5NCO2PMNGNMhf2aDoTsXWSJsb52ulJKqfDia1LIE5FbRCTSft0CHPZnYP6ktUdKKeWer0nhDqzuqAeBA8AorKEvQlKVNioopZRbPiUFY8xeY8y1xph2xpj2xpjrgRv9HFuzu21IKqANzUop5UlTnrzmcYiLYDVrTRYAG7LyAxyJUkoFp6YkhZC7L/hEaQUAU7/aHeBIlFIqODUlKYRsJUxJeWWgQ1BKqaDUYN9METmO+4u/APF+iegUKK8M2XymlFJ+1WBSMMYknapATqXUti0CHYJSSgWlplQfhay567MDHYJSSgWlsEwKSiml3NOkoJRSyhFWSUEfrqOUUg0Lq6SglFKqYWGVFC7q2TbQISilVFALq6RwXmqbQIeglFJBLaySQp+OLQMdglJKBbWwSgoDzmgV6BCUUiqohVVScJV9rDjQISilVNAJ26Rwx/RVgQ5BKaWCTlglBdfbFPKLywMWh1JKBauwSgqtE2Kc6QP5JQGMRCmlglNYJYWICL2lWSmlGhJWSUEppVTDwjopHNQqJKWUqiWsk0JG1rFAh6CUUkElrJNCpLYxKKVULWGdFCJ0LG2llKolvJOClhSUUqqWsE4KkVpSUEqpWsI6KWhBQSmlagu7pPDij/s703uPFAUwEqWUCj5hlxS6tWvhTE94bwOlFZUBjEYppYJL2CUFY2rPl5RVBSYQpZQKQn5LCiIyVURyRGSjh/UiIi+LyA4RyRCRNH/FUlvtrHCkqOzUnFYppUKAP0sK04GrG1g/Auhlv8YBr/oxFkfbxNha8zrUhVJK1fBbUjDGLAWONLDJdcDbxvIN0EpEOvornmpdU1p430gppcJUINsUOgH7XOaz7GX1iMg4EVktIqtzc3ObNYix//iGD9ftb9ZjKqVUqApkUnB3l4BxswxjzBvGmHRjTHq7du2aPZDfzFzX7MdUSqlQFMikkAV0cZnvDGQHKBallFIENinMAX5u90IaBOQbYw4EMB6llAp7Uf46sIjMAIYBbUUkC3gMiAYwxrwGzAdGAjuAIuB2f8WilFLKN35LCsaYsV7WG+Bef52/Ib07JLH14PFay8orq4iODLt7+ZRSqpawvAq+eWt6vWW9HlnAsu15AYhGKaWCR1gmhZQWsW6X3/LPFac4EqWUCi5hmRTiYyIDHYJSSgWlsEwKSiml3NOkUMfUZbuZsXJvoMNQSqmA8Fvvo1D1xEebAfhJehci9dFsSqkwE7ZJoUVMJIVlnh+wM+XT7+iQHMeh/BLuv/LMUxiZUkoFTtgmhQu6p/DZ1hyP6//62Q5nWpOCUipchG2bwsMjzwp0CEopFXTCNin0bJ8Y6BCUUirohG1SUEopVV9YJ4VZdw8OdAhKKRVUwjoppKe28Wm7knLPvZSUUur7JKyTgq96P/oxAJuzCyivrApwNP4z/IXPefXznYEOQykVQJoUfLQz9wQjX/6SXo8s4MN1+6msMuw7UhTosJrV7rxCnvt4a6DDUEoFUNgnhdYJ0T5td9mLXzjTv5m5jh4Pz+fi/1vC6swj/gqtWZWUVzJ50XeUVTS9pPPcx1tJnTCvGaJqmtKKSjKyjgU6DKW+V8I+KXx6/yVMGNG70fuPem05zy/cijGGh97LIHXCPHIKSpoxwtoWbzlEYWmF23XHS8o5fKLU7brXvtjJy4u3869v9jQ5hmCpYnp8ziaufeUrvtyey+w1WW63yT5WTEFJ+SmOrL6S8kq21Xmwk1LBKOyTQkpiLJf2bt+kY/xtyU4enJXBjJX7AFi05ZDP++YXlfP4nE2UVnhvzM7MK+TOt1bzwLvrnWVz12fz+bYcMvMKueT5zzn3qU/d7ltSbpUQ3li6s1bD+dz12Uycu6nOttb6tXuPUuFjG8rrX+xkxa7DPm2793AReR6SlzcXTvqM1AnzqKisYv2+fAB+9s+V/N7lb1It53gJQyZ9xpWTl1JSXklllTnp85VWVJJzvOEkX1xWyV+8lMJ+O3MdV01ZygkPCV2pYBH2SQHgB6clNbl76iyXX6oR4n0gvYP5JazKPMLkRduY/nUmd0xf5XHb97/NorC0gj12G8buvEIACksr+PWMb7lt2iqGvfA5RwrL3O5fVWWcC/2hglJe/GSbs+7XM75l2leZLNx00FnW+9GPeWb+Fm78+9f0fGSBc7HbkXOcL77LdbZbbCe/5xdu5dkFWxn9xjfOuoWbDvLaFzvZnF3AZS9+zubsAmfd0OeXkP7Upxy14/1440FmuoxMW1llmDh3Ewfyi+t9lv3HrGXvrski66j7Np2fvL6c1AnzOP/pxQAcLCih96Mfc+9/1rrdviH3/HutcxxPXv1iJy8t3s5/Vnguha20qxkb6slWWFqhPd1UwIXt2Ed1+do91RdvLN3FmPO68OIn3zH6vC50aZPArtwT7Mg5wZVndwDgyr98QUFJBcnxVpvGVzsOsyPnOD3bJ9U61sb9+fzunfVAzS/hKmP94l252317xofr9vObmev49tErmJuRza7cQqZ/nems/3Zv/Xr4X/5rTb3PUO2lxd9xca92jHG56APc+dZqUlMSyDxcc3EuLqvk6fmb+fc31kV+0gKr4Xrky18C8OUfhjvbDnxyEbPHD+buf1vnHnP+GQC8tzbLSlQbDzL7niF0TI6vF+8LC7dRUFL7V/d7a7O4sGdbj3+XjzcdZN+RIrq0SQBg2fY8WiVE07dTstvtT5RWsNgeH+ufy3Zz50Xd6m2zI+eEcyEvbaCkUP0zwbgprCzbnscnmw/y9vI9pKYk8PmDw+tv5OLTzYe46+3VLP79JfRop3fmq+Ylxt23NIilp6eb1atX++XYf1uyg+cXbvO+oQ9GntOB+RsO1lseGSHM+dWFXPPyMrf7ZU66xpnec7iQDfvz+dV/v6233cMje/PMfPc9hXq2T2RHzgl+fG5n3vVQ1+4vY87rwsxV+xq178Rrz+aC7m24esqXtZbvfGYku/NO8M6qffzjy90NHqN3hyS2NlB3nxgbxcaJVwE4jeWbn7iKRZsPISLcN+NbNk68itWZR7htWu3Sm+u/DcCizYf4xdur6dQqnv3Hipkwojd3X9LDWf/28kxyCkp54KozSX9qEXknylj1yOW0S6r9ONi6jfZ1z1PX795Zx/vf7mfyT/pzY1rnBrdVqpqIrDHG1H9AfR1aUnDxy6HdSWkRw4T3NjT5WO4SAlhVI54SAlh1/NGREbRLiuWmV792ShJ1eUoIYP16BU55QgAanRAAHpuzye3yHg/P9/kYDSUEsH793zp1Za1qsBv//nWt/fo+ttDtvu9/m8UNA2suwlsOWFVi1VVa1b+vnvxoM/9cVpO8HriqZpTdjzce4GeDUwHPVUnGGMSHKshiD/vvOVzIkcIyBp7R2usxlKpLSwp1GGPo9pDvFyEVXp654RzO6pjE3iNF/Gbmulrr2ibGsOLhy+slsT9dcxZPzdvizO96ZiSLthzil/9a4/a5Hr+/4gfMzcjm1iGp3HxBV2f5pAVbmbs+m7M6JvHpFqtay7VU8e7qfVRUGR6yf9RUr8svKmfSx1tJjI3kD1f3JjpSmxLDkZYUGsmXX2gqfD38vudSZN6JMrelGteEANDdZRt3D3p6cdF3ADzy/kaOFZWzISuf+JhI3v92PwCpbROcbbcfOk7eiTK6tW3Bg7My6h2rvLKKO99axeo9RwHoc3pLEmOj+cXbq9k48Sq2HSwgISaKszq2bOhjqzCiSUGpIOaujWv5zpquv1f8ZWmD+//w5WVsO1RTNZZ9rIQFG62qrYx9x/jpmyuAmlJF6oR5XD/gdCZe25dkH2/s9GTZ9jx6nZbIaS3jmnScat/uPcq7a7J4ZORZtIjVS5e/aDnSjZfHDmTJA8P45dDugQ5FqXp8vd1i7vrsWgkBrCSzcb/VFlKdEMDqQvy7d6zqsA/WZdP/iU9q7XeksIzUCfN4efF2co6XODdQ5hSUUFll+HJ7Luv21e7Vdss/V3DdK1/ViyvvRKnTHflk3PD3r/nvir38cXb9EpFqPtqm4EV5ZRW9Hllwys6nVLBIjo9m9vghlFVUOV2KXX3z0GUMerb2PRzr/nwFe48UcU6nZKdtrm5vqureVnWXbzlQQEJMJF1aJ/Diom3cfmE32ibG1tuvd4ckPv7tUK/xz8s4wMxVe/nXnRf48Gm//3xtU9CSghfRkRF89OuLAh2GUqdcfnE5l0/+wm1CALjsxc/rLRv9+jdc+8pXTqmj2uNzNpE6YR75xTVDjhzMLyG/qGZ+xEtfcsnzn/PVzjz+tmQn6U996nbYFteeYnPXZ9e6cfSvi7eTOmEeqRPmce9/1/Ll9jyfP29dM1buJXXCPI9Dx/jqWJFVyvpkk/seiXVt3J/v0wgH/qJJwQd9OyWz+9mRgQ5DqaDirpG8urrqg3XZzrLejy5wbp7sP7GmWmrQs4vp/8Qn9QaVdB2O5NynPmXGyr1uh0XZuD+fX8/4lgfeXU9+cTkLNhxwGukbUveCW1BSXu+Gx+xjxU4vruVuhm8xxrAz94QzX15ZxYasfLfnqy5N/ePLXW7Xu8o6WsQP/7qMx+ds9rqtv2hrjY+0V5JSjVM97pYno9/4hm5tWzjzGXUurlM+/c65QFebsz6b+2bU3NQ5acFWZrgMleLqrrdW8emWHK4bcDoVlYZ5Gw7w4b0X0r9LKwB++o9v2Li/gF8O7c5DI88CrHG/qnVMrt1QXl5ZxYTZG5i9Nov/3nUBQ3q25Ud/XcbWg8eZPX4I53ZtzRff5bL90HFuTOvsfP5VmUdrHccYQ2WVIcqli/Axu+Tk2j5TVWUQOXXXIE0KJ+G5m87hYH4pf/nU+68RpZRvKquMc8MlwOQ6v/YPFdQvJbgmBMBjQgCcezo+dCm9rN17lN4dk3h8zian4f31pbt43R7eJSqi5gK8K7eQ1gkxJMZG0b5lHJMXfcfstVaV1Y7cEwzp2dap0lq85RDJ8VHcOnUlUL878k2vfs3QXu24oHsb1u87xrMLtjJ7/BC+3J7LlE+3O9sZY9h28Di78wq5+99r6Nc5mTm/OjXV2NrQ3EgVlVX865s9TJwbuGKeUqrxfjW8J68s2XFS+9wzrAd/dxk6/of9OvLKT9Oa/fki7oZr8Tb8iTfa0OxnUZER3DYklTsurBkkLS46grho/ZMqFQpONiEAtRICwEcZBzjkh+enuHuqY92Gen/RK1gTiAi/ubwXAH8Z3Z+tT45g08SrAxyVUupUuuCZhodWbwx3jfhgDV/vb5oUmig5PprMSdc4A6VFRghbn7ya8cN6kPg9u+vy6wmXBjoEpcKaj8+8ahJNCn4QFx3JH6/uzY/6n+4sW/7Qpdw73BpWuXu7Fp525Ynrzm7w2FERwtX2Mxn+def5/HywNWDa/Vf8gEt+0K7Wtisfvqze/u/dM4QHXUbtrOuFH/d3pjMnXcPrPzvX2e/0VvGc4/LsgdnjB/OkS7yuT7B7eGRv+ndOdmLLnHQNY+3nJQDc1AxDPjfHMZQKJa4PyPIXbWj2o3dW7eWPs2tGrDTGUGWs0kT1WPyXn3UaURHCH64+k+72A1N+/NrX9bqvVfvFxd148KrerNlzlME9UqisMhSXV5IYG8X4f69hwUbrBpmOyXEsf8hKCidKK5zhoOf+6iLioiO44i9L6dOxJZsP1DwRzXX8G9fnDhSVVZAQY5V63vxyF0/N28LEa8/m1iGpgPXEsEpjaBkXXe9u1cLSCmecGtcRaHc9M9IZGO7J6/vy6AcbmXffReQUlHK7h6fQnXlaUq1hGzInXcOxojI2Zxc4QzZ0b9eCXbmFzjZPXHc2H288yNc7fXtUqFLBrrENzr42NGtS8CNjDP9ctpvR53UhKa7+4GK78wrp3Dre7VDGj324kQ/XZ/PSmIHER0fSqXU8reKjiY+OJCLCfX/lLQcKuPvfa/j9lWdyfmobOrj0r/79/9Yze20Wnz8wjNS2tUsqc9dnExsV4TwVblXmETq3jnf7xLPKKsPCTQcZ0beD237TeSdKKS6rdJ5uVtekBVvp0iaemy/oSkbWMVonxNC5dTyFZZVOdVvd4cs/vPdCvt55mHFDu7Mz9wRr9xzltOQ4hp9ZUzLZfug4PdsnYgw8PX8LtwzqSoeWccTHRJJTUMLrS3dx7/CeLNmaw+AeKdz11momj+5P7w4teWHhNl5ZsoPR6V14Z3X950E8P6ofj8/ZxI/6n86km/o1e08TpU5GSCcFEbkaeAmIBN40xkyqs74rMBVoBxwBbjHGNPhkmFBKCsGkpLySdfuOMah7SqBD8cm+I0Vc/H9LgKZ3xfNm6Xe5/HzqSudGpKoqw4OzMmidEM3+Y8X8ZfQA4qIj3cY2pEeK11LI+j9fWW+AOaUaK2STgohEAt8BVwBZwCpgrDFms8s27wIfGWPeEpFLgduNMT9r6LiaFMLHrDVZfLk9l5fGDPTy8e65AAAR10lEQVT7uQpKymnppjTnyR3TVzG8d3t+Nshq03FNFLueGcnmAwV8s+swlVWGX17Sg915hSzafJBn5m+la0oCew7X73LozoxfDOKpeZvZlF3ArYO78tbyPQBMGNHbef61r6qr6VRo83dS8GdD8/nADmPMLmNMGTATuK7ONn2A6v5cS9ysV2Fs1LmdT0lCAE4qIQBMve08JyEAdGmTQHrX1vRqn0hEhNC3UzJ3XdydX9rPbO7WtgXjhvYgc9I1PHpNn1rHmjlukDPt2pAPMLhHitOxoHpYBoC7L+nB9NvPY8sTVzM6vUutfT69v/4IoiktYrjlgjPqLa/rxoGdvG6jvt/82WeyE+BaQZsF1B3Ddj1wE1YV0w1AkoikGGO0VTBUVJTCkd1weEftV8F+iIiGqDiIim3k+0nuExHpPV4/mjV+iE/bXd7nNDInXUNVlaHSGKIjI/jzD/vQt1My53drw46cE1w++QsmXmv17Lp7WA86JMdx/YBOJMZGUVhmPctgmN2m8tyofk5byHv3DKFn+yTnXJ1axbPo/qFOR4HlD11Ky7ho4qIjaz0lrrrqrKyiivfsJ7yp8OTPpOCuNbRuXdUDwCsichuwFNgPVNQ7kMg4YBzAGWd4/7WjmllVlXWRr3vhP7wDju0F49J5ukV7aNsLzhgMVZVQUWIljooSKCuEosM183Xf6309TlJ1EoprCQltICEF4u1359Wm/nR0/Qb1UyEiQoiw/5vccVHNnfE92yfWqiKIjozgx3ZpoLozQF3jhnbnaGEZaWe0BmDTxKsQwUkG1Vw7D8y/72IenLWeTdkFDOnZFoCYKKvyoFf7RCaM6E3eiVL+OHsDtw7uyq8u7cV5T3/q8fO8d88QIkQ4WljGu2v2MX+Db0NFq+DizzaFwcDjxpir7PmHAIwxz3rYPhHYaoxpsPO5tin4UdGR+hf9vB1wZKd90bbFJEJKD0jpab962fM9IC7Z8/EbYgxUlrtPFs57Q+tctikpsJJP8RHrvegwFLvv4gtAdELtJBHvJnHUnY6K9Xy8EFJVZaioMk4yqGaMQUQwxrB812EGd09BRGr1vHr9Z+dybtfWpD9lJYq6dd2VVYbsY8VOW8vg7ikkxESyeGuOs82yPw7noueW1Ivrh/060q1tC/762ckPRfF95+82BX+WFFYBvUSkG1YJYAzwU9cNRKQtcMQYUwU8hNUT6fvlwHpY85b1azSmhfUebb/HJFgXpOgEl3XV8/Z7c1eJlBfDkV21L/rV08UuY8pHREHrVOui32O4SwLoCUkdoLmH8RWBqBjr5Q+VFVByrCZJFLkkjLrzRzOt9xL34+MDVmKsl0TaQGxLiE2ySiuxSRCbXGc+CWKSICI47huNiBBi3HRxru5uLCIM6dHWWf72Hefz86kr+eDeCxlgt3E8/qM+TgO4q8gIqdU1eYbddrJw00HmrMtm4nVn0zYxlq8mXMqFkz4DahrDW8ZH8/srz2yWpLD1yavp/ejHtZb175zMepchumePH8xNry5v8rn87b93+f8pcv7ukjoSmILVJXWqMeZpEXkCWG2MmSMio4BnseoNlgL3GmMafMxRyJUUti2AD39lXYzLC71vX1dkbO3kUSu5uCYQN4kmOsG6uDm//HdC/j5qVdMkdbQv9j3sX/z2hb91V4hs2oPbQ15luVXCcJs86iSV4iNQdBRKC/CpGizGNVHUTSQtfVsWndD8ydkPjpdYg7i5u1enWlWVwQCz12Txh9kZ/OLibjxyTR8O5pcw6NnFxEdHsupPlxMfHUlRWQUfrMvm0Q820rN9It3btuCTzYfcHvfJ6/vys0Fd+eK7XP67Yg+PjOxD6xbRTiyuN1u69iBzp1/nZOdZD/Pvu9jjE+l84W4UVF80pXt2wLuk+kvIJQVXxtjJwU4Q5cVWPXt5kcu0va6sqM52RXX2Kbb2qzvt7oIU27LORb9HzXtsUv3tVeNVVVn/TiUFUHrcShKlBXXmj7vM59vvx2tvU+5Dl1WJdEkSyVbV3cm8YlsGTYmlWnllFX9bsoNxQ7s77SHvrNrLoO4pdE2pfdNlYWkFsVERREYIf/pgI4mxURwtKuPGtM6MeeMbbkrrzIs/6e/uNI55GQfo2CrOaYs5WljGwCcXAfDHq3uTkhhDZZVh35EiHrzqTGatyaJvp2TO6tjSSSi7nhnJHW+t4vNtufWOv/bRK3jlsx1M/Wq3s2z3syMREdbsOcID72bw6i1pXD3FSjBLHxzOGSkJHC8p5+ONB3lwVoaz37X9T+flsY3vjadJIRwZY9WtlxfZSaLI+s+f2D4kflEqF5UVNQnEayKxk05Jvj2dXzPtTWzLk08mtZJKYHt8eXKksIykuCi3owV4U1hawcGCEnrYw854MmtNFp9tPcTfb7bGBxv+wufszivkm4cuqzWagC+Kyyr5dt/RWlV1QL1hY5pCk4JS4a6qsnaScPtqYH1pA20q1WKSGkgcHhJObEuIa2Wt/x5VUe45XMjc9dncO7xnsz06c9+RIvKLy+lb5/6VxtCkoJRqmqpKuzSSX78UUv0qPtZw4vHWvhLd4iQSSbKdTOxlMQkQFR90VWDBKhh6HymlQllEJMS3sl6NUVUFZSfqlD7cJZBjNdMnciBve828cf+wmVoiY2pudoyOsxJFdJzLsvja7/W2O8ntI2NBIqwq2e9htawmBaWUf0RE2L/8WwJdvG5ejzFW5wl3SaX4mNVuVlFidbRw3kuhohjKS+z3YqsHWUWJyzL7varefbKNIxGAuCQKT/PiZb1rovGw/txbYfC9zRO3B5oUlFLBSQRiE61Xsh/GZKqsqLnhsTqxuEse5SW1t6sss+7iN8a+m980MG+8rHedx/vxWrTz/HmaiSYFpVR4ioyCSDvpKIe20CillHJoUlBKKeXQpKCUUsqhSUEppZRDk4JSSimHJgWllFIOTQpKKaUcmhSUUko5Qm5APBHJBeo/5sk3bYG8ZgznVArl2EHjD6RQjh1CO/5gir2rMcbrLdEhlxSaQkRW+zJKYDAK5dhB4w+kUI4dQjv+UIxdq4+UUko5NCkopZRyhFtSeCPQATRBKMcOGn8ghXLsENrxh1zsYdWmoJRSqmHhVlJQSinVgLBICiJytYhsE5EdIjIhAOefKiI5IrLRZVkbEVkkItvt99b2chGRl+1YM0QkzWWfW+3tt4vIrS7LzxWRDfY+L4v91HBP5zjJ2LuIyBIR2SIim0TkNyEWf5yIrBSR9Xb8E+3l3URkhX3sd0Qkxl4ea8/vsNenuhzrIXv5NhG5ymW52++Xp3M04jNEisi3IvJRCMaeaf/brhOR1fayUPnutBKRWSKy1f7+Dw6V2JvEGPO9fgGRwE6gOxADrAf6nOIYhgJpwEaXZf8HTLCnJwDP2dMjgQWAAIOAFfbyNsAu+721Pd3aXrcSGGzvswAY0dA5TjL2jkCaPZ0EfAf0CaH4BUi0p6OBFXZc/wPG2MtfA8bb0/cAr9nTY4B37Ok+9ncnFuhmf6ciG/p+eTpHIz7D/cB/gY8aOm6Qxp4JtK2zLFS+O28Bd9nTMUCrUIm9Ka9TdqJAvew/+kKX+YeAhwIQRyq1k8I2oKM93RHYZk+/Doytux0wFnjdZfnr9rKOwFaX5c52ns7RxM/xIXBFKMYPJABrgQuwbiiKqvsdARYCg+3pKHs7qfu9qd7O0/fL3sftOU4y5s7AYuBS4KOGjhtssdv7ZlI/KQT9dwdoCezGbncNpdib+gqH6qNOwD6X+Sx7WaCdZow5AGC/t7eXe4q3oeVZbpY3dI5GsasjBmL92g6Z+O3ql3VADrAI69fxMWNM9ZPbXc/pxGmvzwdSGvG5Uho4x8mYAvwBqLLnGzpusMUO1pOHPxGRNSIyzl4WCt+d7kAuMM2uuntTRFqESOxNEg5JQdwsC+YuV57iPdnlzUpEEoHZwG+NMQUNbeohnoDFb4ypNMYMwPrVfT5wVgPnbK74m/y5ROSHQI4xZo3r4gaOGzSxu7jQGJMGjADuFZGhDWwbTN+dKKwq31eNMQOBQqyqHE+CKfYmCYekkAV0cZnvDGQHKBZXh0SkI4D9nmMv9xRvQ8s7u1ne0DlOiohEYyWE/xhj3gu1+KsZY44Bn2PV+bYSkSg353TitNcnA0ca8bnyGjiHry4ErhWRTGAmVhXSlBCJHQBjTLb9ngO8j5WUQ+G7kwVkGWNW2POzsJJEKMTeJOGQFFYBvezeFDFYDXBzAhwTWDFU90S4Fauuvnr5z+3eDIOAfLsIuRC4UkRa270RrsSq5z0AHBeRQXbvhZ/XOZa7c/jMPuY/gS3GmMkhGH87EWllT8cDlwNbgCXAKA/xV59zFPCZsSp35wBjxOrh0w3ohdVQ6Pb7Ze/j6Rw+McY8ZIzpbIxJtY/7mTHm5lCIHUBEWohIUvU01r/5RkLgu2OMOQjsE5Ez7UWXAZtDIfYmO5UNGIF6YfUM+A6rLvmRAJx/BnAAKMf6hXAnVr3tYmC7/d7G3laAv9mxbgDSXY5zB7DDft3usjwd6z/bTuAVam5KdHuOk4z9IqxibQawzn6NDKH4+wHf2vFvBP5sL++OdWHcAbwLxNrL4+z5Hfb67i7HesSOcRt2T5GGvl+eztHI79AwanofhUTs9jHW269N1ccPoe/OAGC1/d35AKv3UEjE3pSX3tGslFLKEQ7VR0oppXykSUEppZRDk4JSSimHJgWllFIOTQpKKaUcmhRU0BGRSrFG1VwvImtFZIiX7VuJyD0+HPdzEQmp5+X6m4hMF5FR3rdU4UKTggpGxcaYAcaY/lgDtD3rZftWWCOEBiWXO4OVCnqaFFSwawkcBWv8JRFZbJceNojIdfY2k4AedunieXvbP9jbrBeRSS7H+7FYz1f4TkQutreNFJHnRWSVWGPh/9Je3lFEltrH3Vi9vSuxnhfwnH3MlSLS014+XUQmi8gS4Dmxxsj/wD7+NyLSz+UzTbNjzRCRm+zlV4rIcvuzvivW2FOIyCQR2Wxv+4K97Md2fOtFZKmXzyQi8op9jHmc4sHWVAg4lXfK6UtfvryASqw7p7dijfR5rr08CmhpT7fFukNUqD8s+QjgayDBnq++6/Rz4EV7eiTwqT09DviTPR2LdRdrN+D31NyFGwkkuYk102Wbn1Nz1/F0rKGuI+35vwKP2dOXAuvs6eeAKS7Ha21/tqVAC3vZH4E/Y43Jv42aO19b2e8bgE51lnn6TDdijRQbCZwOHANGBfrfXF/B89JirQpGxcYa1RQRGQy8LSJ9sRLAM2KNtFmFNdTwaW72vxyYZowpAjDGHHFZVz2g3xqsZALWeDT9XOrWk7HGB1oFTBVrQMAPjDHrPMQ7w+X9Ly7L3zXGVNrTFwE32fF8JiIpIpJsxzqmegdjzFGxRkftA3xlDYtDDLAcKABKgDftX/kf2bt9BUwXkf+5fD5Pn2koMMOOK1tEPvPwmVSY0qSggpoxZrmItAXaYf26b4dVcigXa/TQODe7CZ6HIS613yup+f4L8GtjzMJ6B7IS0DXAv0TkeWPM2+7C9DBdWCcmd/u5i1WARcaYsW7iOR9rcLYxwK+AS40xd4vIBXac60RkgKfPJCIj3ZxPKYe2KaigJiK9sao6DmP92s2xE8JwoKu92XGsR4VW+wS4Q0QS7GO08XKahcB4u0SAiPxArBE+u9rn+wfWSLFpHvYf7fK+3MM2S4Gb7eMPA/KM9VyKT7Au7tWftzXwDXChS/tEgh1TIpBsjJkP/BZrwDZEpIcxZoUx5s9Yw1538fSZ7DjG2G0OHYHhXv42KsxoSUEFo3ixnpQG1i/eW40xlSLyH2CuWA+Ar25zwBhzWES+EpGNwAJjzIP2r+XVIlIGzAcebuB8b2JVJa0Vq74mF7gea2TSB0WkHDiB1WbgTqyIrMD6kVXv173tcayneGUARdQMjfwU8Dc79kpgojHmPRG5DZghIrH2dn/CSn4fikic/Xf5nb3ueRHpZS9bjDUqaYaHz/Q+VpvGBqzRUb9o4O+iwpCOkqpUE9hVWOnGmLxAx6JUc9DqI6WUUg4tKSillHJoSUEppZRDk4JSSimHJgWllFIOTQpKKaUcmhSUUko5NCkopZRy/D/PSVNSeNfjNgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.recorder.plot_losses(skip_start=1000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn.save('arithmetics_25perc')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Calculate 8 - (0 + 7 + -4).                5\\n'"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train['text'].iloc[2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "What is 1 + -9 - -5 - -1? _ _ _ _ _ _ _ _ _ _ _ _ _ _ 6 3 2 \n",
      " xxbos _\n",
      "solution: -2\n",
      "\n",
      "\n",
      "-2 + 0 + (3 - 1) _ + _ 6 _ + _ 1 . _ _ _ _ _ _ _ _ _ _ _\n",
      "solution: 0\n",
      "\n",
      "\n",
      "Calculate 8 - (0 + 7 + -4). _ _ _ _ _ _ _ _ _ _ _ _ _ _ - 9 \n",
      " xxbos _ M\n",
      "solution: 5\n",
      "\n",
      "\n",
      "What is the value of (-19 - -12) + (-6 - -5) - -15? _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - 4 6\n",
      "solution: 7\n",
      "\n",
      "\n",
      "Evaluate (2 + -8 - -2) + -120 + 129. _ _ _ _ _ _ _ _ _ _ _ _ _ - 1 \n",
      " xxbos _ W h\n",
      "solution: 5\n",
      "\n",
      "\n",
      "What is the value of (47 - 40) + -9 + 0? _ _ _ _ _ _ _ _ _ _ _ _ _ _ - 1 5 \n",
      " xxbos _\n",
      "solution: -2\n",
      "\n",
      "\n",
      "Calculate -27 + 29 - (-2 + 3). _ _ _ _ _ _ _ _ _ _ _ _ _ 4 2 / 1 2 \n",
      " xxbos\n",
      "solution: 1\n",
      "\n",
      "\n",
      "Calculate (3 - 5) + (4 - 2) - -4. _ _ _ _ _ _ _ _ _ _ _ _ _ _ - 7 7 0 \n",
      " xxbos\n",
      "solution: 4\n",
      "\n",
      "\n",
      "Calculate -7 + 7 + (-5 - -3). _ _ _ _ _ _ _ _ _ _ _ _ _ - 1 1 \n",
      " xxbos _ I\n",
      "solution: -2\n",
      "\n",
      "\n",
      "What is the value of 8 + -4 + 10 + -7? _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 1 4 \n",
      " xxbos _\n",
      "solution: 7\n",
      "\n",
      "\n",
      "What is the value of (-4 - -6) + (0 - -1) + 0? _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - 1 \n",
      " xxbos\n",
      "solution: 3\n",
      "\n",
      "\n",
      "What is the value of -2 - (-2 + (-5 - (-7 - -2)))? _ _ _ _ _ _ _ _ _ _ _ _ _ - 1 \n",
      " xxbos _ W h\n",
      "solution: 0\n",
      "\n",
      "\n",
      "Calculate 9 - (0 + 7 + -2). _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - 7 / 1 7\n",
      "solution: 4\n",
      "\n",
      "\n",
      "Evaluate -27 + (3 - -22) + (-1 - -6). _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - 4 \n",
      " xxbos _\n",
      "solution: 3\n",
      "\n",
      "\n",
      "What is 6 + (-2 - 2) - -5? _ _ _ _ _ _ _ _ _ _ _ _ _ _ - 6 \n",
      " xxbos _ W\n",
      "solution: 7\n",
      "\n",
      "\n",
      "What is -2 - (-2 + -1 - -2)? _ _ _ _ _ _ _ _ _ _ _ _ _ 5 \n",
      " xxbos _ P u t\n",
      "solution: -1\n",
      "\n",
      "\n",
      "What is -3 + (3 + -1 - (1 + 2))? _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - 4\n",
      "solution: -4\n",
      "\n",
      "\n",
      "Calculate -10 - (-7 + 12 + -12). _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 5 3 \n",
      "\n",
      "solution: -3\n",
      "\n",
      "\n",
      "Calculate -5 + -3 + (0 - -7) - -2. _ _ _ _ _ _ _ _ _ _ _ _ _ _ - 5 3 8 8 7\n",
      "solution: 1\n",
      "\n",
      "\n",
      "Evaluate -5 + -4 + 13 + (-2 - -2). _ _ _ _ _ _ _ _ _ _ _ _ - 6 \n",
      " xxbos _ I n _\n",
      "solution: 4\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "for i in range(20):\n",
    "    text = df_train['text'].iloc[i]\n",
    "    print(learn.predict(text.split(' '*16)[0], n_words=20))\n",
    "    print('solution:', text.split(' '*16)[1])\n",
    "    print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
